/*
 * 
 * 
 * 
 */
package com.hboxs.asl.dao;

import com.hboxs.asl.Filter;
import com.hboxs.asl.Order;
import com.hboxs.asl.Page;
import com.hboxs.asl.Pageable;
import com.hboxs.asl.entity.Coupon;
import com.hboxs.asl.entity.CouponCode;
import com.hboxs.asl.entity.Member;

import java.util.List;

/**
 * Dao - 优惠码
 */
public interface CouponCodeDao extends BaseDao<CouponCode, Long> {

    /**
     * 判断优惠码是否存在
     *
     * @param code 号码(忽略大小写)
     * @return 优惠码是否存在
     */
    boolean codeExists(String code);

    /**
     * 根据号码查找优惠码
     *
     * @param code 号码(忽略大小写)
     * @return 优惠码，若不存在则返回null
     */
    CouponCode findByCode(String code);

    /**
     * 生成优惠码
     *
     * @param coupon 优惠券
     * @param member 会员
     * @return 优惠码
     */
    CouponCode build(Coupon coupon, Member member);

    /**
     * 生成优惠码
     *
     * @param coupon 优惠券
     * @param member 会员
     * @param count  数量
     * @return 优惠码
     */
    List<CouponCode> build(Coupon coupon, Member member, Integer count);

    /**
     * 查找优惠码分页
     *
     * @param member   会员
     * @param pageable 分页信息
     * @return 优惠码分页
     */
    Page<CouponCode> findPage(Member member, Pageable pageable);

    /**
     * 查找优惠码数量
     *
     * @param coupon     优惠券
     * @param member     会员
     * @param hasBegun   是否已开始
     * @param hasExpired 是否已过期
     * @param isUsed     是否已使用
     * @return 优惠码数量
     */
    Long count(Coupon coupon, Member member, Boolean hasBegun, Boolean hasExpired, Boolean isUsed);

    /**
     * 查找优惠码集合
     *
     * @param member     会员
     * @param hasBegun   是否已开始
     * @param hasExpired 是否已过期
     * @param isUsed     是否已使用
     * @param filters    筛选
     * @param orders     排序
     * @return 优惠码集合
     */
    List<CouponCode> findList(Member member, Boolean hasBegun, Boolean hasExpired, Boolean isUsed, List<Filter> filters, List<Order> orders);

    /**
     * 获取未使用且未过期优惠券的数量
     *
     * @param member
     * @return
     */
    Long countUnusedCouponCodes(Member member);

    /**
     * 获取已使用且未过期优惠券的数量
     *
     * @param member
     * @return
     */
    Long countUsedCouponCodes(Member member);

    /**
     * 获取过期优惠券的数量
     *
     * @param member
     * @return
     */
    Long countOverdueCouponCodes(Member member);


    /**
     * 获取未使用且未过期优惠券
     *
     * @param member
     * @return
     */
    List<CouponCode> findUnusedCouponCodes(Member member);

    /**
     * 获取已使用且未过期优惠券
     *
     * @param member
     * @return
     */
    List<CouponCode> findUsedCouponCodes(Member member);

    /**
     * 获取过期优惠券
     *
     * @param member
     * @return
     */
    List<CouponCode> findOverdueCouponCodes(Member member);
}